#   todo 数据清洗的代码文件
import pandas  as pd
from hdfs.client import Client
import pymysql

#   todo 修改pandas的内置参数，让其显示所有的行和列
#   显示所有列数据
pd.set_option('display.max_columns',None)
#   显示所有行数据
pd.set_option('display.max_rows',None)
#   设置value的长度
pd.set_option('max_colwidth',100)
#   设置1000列时才换行
pd.set_option('display.width',1000)


data=pd.read_csv('source.csv')

#   todo    1. 对数据进行去重
# print("数据去重前的数据量",len(data))
data.drop_duplicates(inplace=True)
# print("数据去重后的数据量",len(data))

#   todo 2.去除空值行
print("去除空值行前的数据量",len(data))
data.dropna(inplace=True)
print("去除空值行后的数据量",len(data))

#   todo 3.提取车型年份
#   定义方法拿到小车出产年份
def get_production_year(x):
    list=x.split(" ")
    for j in list:
        if "款" in j:
            return j.split("款")[0]
    #   遍历完所有的，不含"款"才返回空
    return None
# print(data['name'])
data['production_year']=data['name'].apply(get_production_year)
print(data['production_year'])

#   todo 4.拆分列
data['distance']=data['info'].apply(lambda x:x.split("／")[0].split("万公里")[0]) # 路程字段
data['time']=data['info'].apply(lambda x:x.split("／")[1])
data['city']=data['info'].apply(lambda x:x.split("／")[2])
def get_huiyuan(x):
    list=x.split("／")
    if len(list)==4:
        return list[3]
    else:
        return "暂无数据"
data['huiyuan']=data['info'].apply(get_huiyuan)
print(data[['distance','time','city','huiyuan']])


#   todo 5.数据标准化
# print(data[['price','old_price']])
data['price']=data['price'].apply(lambda x:x.split("万")[0])
data['old_price']=data['old_price'].apply(lambda x:x.split("万")[0])
#   把这两列数据转化为数值类型，转换不成功的则为Nan，后面将其去掉
for x in ['price','old_price']:
    data[x]=pd.to_numeric(data[x],errors='coerce')
#   去掉空值行数据
data.dropna(inplace=True)
print(data[['price','old_price']])

print(data)

#   todo 将处理好的数据写入mysql和hdfs
data.to_csv('clean.csv',index=False,header=True)

#   创建一个hdfs的客户端实例(9870是web端访问hdfs的端口号)
client=Client('http://192.168.40.110:9870')

#   hdfs上面存储的路径
hdfs_path="/hzl/"

#   使用客户端的upload方法将文件上传到hdfs
client.upload(hdfs_path=hdfs_path,local_path='clean.csv',overwrite=True)

#     todo 将处理好的数据写入mysql
#   建立与mysql的连接
connect = pymysql.connect(host='192.168.40.110', user='root', password='123456', database='hzl', charset='utf8')
#   通过连接创建游标对象
cursor = connect.cursor()
#   定义sql如果存在表就删除表
drop_table_sql = 'drop table if exists clean;'
cursor.execute(drop_table_sql)
#   定义创建表格的sql
CreateTable_sql = """
create table if not exists clean(
            id int primary key AUTO_INCREMENT,
            name varchar(500),
            info varchar(500),
            price varchar(500),
            old_price varchar(500),
            image_url varchar(500),
            info_url varchar(500),
            guohu varchar(500),
            production_year varchar(500),
            distance double,
            time varchar(500),
            city varchar(500),
            huiyuan varchar(500)
            
);
"""
#   执行创建表的语句
cursor.execute(CreateTable_sql)
#   定义插入数据的sql语句
insert_sql = """
    insert into clean(
        name,info,price,old_price,image_url,info_url,guohu,production_year,distance,time,city,huiyuan
    )
    values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);
"""
#   换成list[row]的形式方便写入mysql
data_list = data.values.tolist()
#   执行插入数据
cursor.executemany(insert_sql, data_list)

#   提交任务(只有提交了任务才会执行sql)
connect.commit()
#   关闭游标对象
cursor.close()
#   关闭连接
connect.close()
print("数据已经保存到mysql..............")


